XGBoost GPU安装

写在前面

随着业务场景的慢慢深入, 数据量的逐步增大, 模型的训练时间不断的变长, 导致模型训练成本逐步增大. 所以需要更加高效的提高硬件计算资源的利用率, 本文主要介绍安装GPU版本的XGBoost.

单机部署

安装前提是需要GPU驱动, cudnn等安装正确, 如果这步没有安装, 请参见Ubuntu16.04下安装安装CUDA9.0、cuDNN7.0和tensotflow-gpu 1.8.0以上的版本流程和问题总结的具体安装方式.

1、下载源码

在git clone下来的xgboost中执行

git submodule init
git submodule update

更新子依赖, 或者使用:

git clone --recursive https://github.com/dmlc/xgboost

PS 如果从github上download xgboost源码压缩包, 后面的安装过程会出错, 原因是download过程不能将xgboost的子依赖项目下载下来. 20190823Update

2、新建build文件目录

在/xgboost, 目录下新建/build文件夹

cd xgboost
mkdir build

3、编译源码

执行cmake

cmake .. -DUSE_CUDA=ON

执行结果如下图所示:

xgboost-3

4、make

执行make

make -j4

执行过程和执行结果如下图:

xgboost-4

xgboost-5

PS很多教程中提到, 在make的过程中不需要用到-j4中的4, 他的解释是使用后会自动生成build目录, 但是我的理解是在新建的build目录下执行上面的命令, 所以不太理解他的做法, 另外我在pull源码下来后, 源码里事先没有build文件目录, 需要手动新建.

virtualenv中更新XGBoost

一般的, 为了不污染原始环境, 我们都会使用虚拟环境隔离开发环境, 比如virtualenv或conda. 我使用的是vitrualenv, 所以介绍virtualenv中如何更新, 其实方式比较简单.

直接pip uninstall XGBoost先卸载掉原始的XGBoost 然后重新安装即可. 虚拟环境下可以完美调用GPU运行XGBoost.
调用情况如下:

xgboost-6

annaconda下面没有测试过, 可能也需要重新安装.

XGBoost的多GPU部署

[UPDATE20190710]
上面的初始化过程中, 是不能使用分布式GPU进行计算的, 而且只能使用单个的GPU, 为了能够使用分布式GPU训练, 需要设置USE_NCCL=ON, 另外, 分布式GPU训练依赖Nvidia的NCCL2, 需要另外安装. 特别的, 目前NCCL2只支持linux系统, 所以分布式GPU训练只支持linux系统.

详细的安装方式:

mkdir build
cd build
cmake .. -DUSE_CUDA=ON -DUSE_NCCL=ON -DNCCL_ROOT=/path/to/nccl2
make -j4

我在配置安装过程时, 使用的命令:

-DNCCL_ROOT=/usr/include

PS, 这里的分布式GPU训练, 笔者认为是单服务器多GPU训练, 并不是我们所谓的分布式服务器的方式, 不过暂时还没有验证.

NCCL2安装

NCCL是Nvidia Collective multi-GPU Communication Library的简称,它是一个实现多GPU的collective communication通信库,Nvidia做了很多优化,以在PCIe、Nvlink、InfiniBand上实现较高的通信速度。

dpkg -i nccl-repo-ubuntu1604-2.4.8-ga-cuda10.0_1-1_amd64.deb

[2019-10-21 UPDATE]初次安装可能会出现下面的提示:

root@Super-Server:/home/soft# dpkg -i nccl-repo-ubuntu1804-2.4.8-ga-cuda10.1_1-1_amd64.deb

Selecting previously unselected package nccl-repo-ubuntu1804-2.4.8-ga-cuda10.1.
(Reading database ... 185150 files and directories currently installed.)
Preparing to unpack nccl-repo-ubuntu1804-2.4.8-ga-cuda10.1_1-1_amd64.deb ...
Unpacking nccl-repo-ubuntu1804-2.4.8-ga-cuda10.1 (1-1) ...
Setting up nccl-repo-ubuntu1804-2.4.8-ga-cuda10.1 (1-1) ...

The public CUDA GPG key does not appear to be installed.
To install the key, run this command:
sudo apt-key add /var/nccl-repo-2.4.8-ga-cuda10.1/7fa2af80.pub

按照提示, 执行

sudo apt-key add /var/nccl-repo-2.4.8-ga-cuda10.1/7fa2af80.pub

即可, 执行完成之后,会输出OK

如果您正在使用网络存储库,则使用以下命令。这种不推荐.

  sudo apt install libnccl2 libnccl-dev

如果您希望保留较旧版本的CUDA,请指定特定版本,例如上图第二个框框中的内容:

  sudo apt install libnccl2=2.4.7-1+cuda10.0 libnccl-dev=2.4.7-1+cuda10.0

请参阅官网安装手册以了解确切的软件包版本。

sudo mkdir -p /usr/local/cuda/nccl/lib
sudo ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 /usr/local/cuda/nccl/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.7 /usr/local/cuda/lib64/

执行下面的命令:

cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2

执行效果如下:

ubuntu@AiDLHost:~$ cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 5
#define CUDNN_PATCHLEVEL 1
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"

多卡运行测试

nccl的安装教程不多, 也没有提供什么测试案例, 所以只能直接运行xgboost,观察多张卡的使用情况, 我使用xgboost源码下的demo进行测试:
测试demo:
~/xgboost/demo/gpu_acceleration
运行之前查看GPU的状态:

xgboost-4_1

运行过程中查看GPU的运行状态:

xgboost-4

从上图中可以看出demo运行过程中4张卡都被占用. 所以应该是安装成功了(ps没有在未安装nccl2之前尝试运行demo, 所以不确定是不是nccl2起作用了).

另外, demo的运行结果:

[2996]  test-merror:0.031765
[2997]  test-merror:0.031758
[2998]  test-merror:0.031751
[2999]  test-merror:0.031772
GPU Training Time: 241.86946082115173 seconds

[2995]  test-merror:0.031648
[2996]  test-merror:0.031641
[2997]  test-merror:0.031655
[2998]  test-merror:0.031634
[2999]  test-merror:0.031641
CPU Training Time: 3853.92036151886 seconds

从运行结果可以看出, 相同的迭代次数下, GPU的运行时间大大缩短.

注意点

1、cmake 版本更新

方法一

在编译过程中,可能会出现下面的问题, 原因是cmake的版本太低, 需要更新cmake版本.

CMake Error at CMakeLists.txt:62 (cmake_minimum_required):
  CMake 3.12 or higher is required.  You are running version 3.5.1

版本更新教程见StackExcahnge
简单的安装步骤:

step 0: sudo apt remove cmake
step 1: cd /opt
step 2: wget https://github.com/Kitware/CMake/releases/download/v3.15.0-rc3/cmake-3.15.0-rc3-Linux-x86_64.sh
step 3: chmod +x cmake-3.*your_version*.sh
step 4: sudo bash cmake-3.*your_version*.sh
step 5: sudo ln -s /opt/cmake-3.*your_version*/bin/* /usr/local/bin

方法二

官网下载链接
下载完成之后, 解压, 安装

tar -zxvf cmake-3.15.1.tar.gz

./bootstrap
make
make install

2、安装XGBoost gpu版本, python的版本必须大于3.5

报错如下:

RuntimeError: Python version >= 3.5 required.

XGBoost_GPU使用

[UPDATA20190710]
在使用gpu训练XGBoost模型的时候, 如果training params中的max_depth设置过高, 可能会引起服务器内存过高的问题.

参考文献

Installation Guide

linux下安装XGBoost并支持GPU(anaconda3)

ubuntu安装xgboost,CPU版和GPU版配置

GPU加速xgboost——win10下配置

Ubuntu16.04安装GPU版xgboost

xgboost 多gpu支持 编译

NCCL2 Survey

Ubuntu 16.04安装NCCL 2

安装cuDNN和NCCL指南

深度学习入门教程-Ubuntu18.04系统安装cuDNN7和NCCL2